package br.usp.ime.ingpos.testes.services;

import java.util.ArrayList;
import java.util.List;

import org.mockito.Mockito;

import br.usp.ime.ingpos.modelo.Inscricao;
import br.usp.ime.ingpos.modelo.Orientador;
import br.usp.ime.ingpos.modelo.dao.InscricaoDAO;
import br.usp.ime.ingpos.services.CandidatoService;
import br.usp.ime.ingpos.services.InscricaoService;
import br.usp.ime.ingpos.services.OrientadorService;
import br.usp.ime.ingpos.services.ProcessoSeletivoService;
import br.usp.ime.ingpos.services.UsuarioService;
import br.usp.ime.ingpos.testes.BancoDeDadosTestCase;
import br.usp.ime.ingpos.web.controllers.UsuarioSessao;

public class InscricaoServiceTeste extends BancoDeDadosTestCase {
	public InscricaoServiceTeste(final String name) {
		super(name);
	}

	InscricaoService inscricaoService;
	private OrientadorService orientadorService;
	private InscricaoDAO inscricaoDAO;

	@Override
	protected void setUp() throws Exception {
		super.setUp();

		UsuarioSessao usuarioSessao = Mockito.mock(UsuarioSessao.class);
		UsuarioService usuarioService = Mockito.mock(UsuarioService.class);
		inscricaoDAO = Mockito.mock(InscricaoDAO.class);
		CandidatoService candidatoService = Mockito
				.mock(CandidatoService.class);
		ProcessoSeletivoService processoSeletivoService = Mockito
				.mock(ProcessoSeletivoService.class);
		orientadorService = Mockito.mock(OrientadorService.class);

		inscricaoService = new InscricaoService(usuarioSessao, usuarioService,
				inscricaoDAO, candidatoService, processoSeletivoService,
				orientadorService);
	}

	public void testInscricaoAtual() {
		//assertNotNull(inscricaoService.getInscricaoAtual());
	}

	public void testSalvaOrientadoresComSomenteUmErro() {
		List<Inscricao> listaInscricoes = new ArrayList<Inscricao>();
		List<String> nomeOrientadores = new ArrayList<String>();

		Inscricao inscricao1 = new Inscricao();
		inscricao1.setInscricaoID(10L);

		Inscricao inscricao2 = new Inscricao();
		inscricao2.setInscricaoID(20L);

		Inscricao inscricao3 = new Inscricao();
		inscricao3.setInscricaoID(60L);

		Inscricao inscricao4 = new Inscricao();
		inscricao4.setInscricaoID(640L);

		listaInscricoes.add(inscricao1);
		listaInscricoes.add(inscricao2);
		listaInscricoes.add(inscricao3);
		listaInscricoes.add(inscricao4);

		nomeOrientadores.add("Jose");
		nomeOrientadores.add(null);
		nomeOrientadores.add("Fuinha");
		nomeOrientadores.add("Quiabo da Silva");

		Orientador orientador1 = new Orientador("Orientador 1");
		Orientador orientador2 = new Orientador("Orientador 2");

		Mockito.when(orientadorService.procuraOrientadorPorNome("Jose"))
				.thenReturn(null);
		Mockito.when(orientadorService.procuraOrientadorPorNome("Fuinha"))
				.thenReturn(orientador1);
		Mockito.when(
				orientadorService.procuraOrientadorPorNome("Quiabo da Silva"))
				.thenReturn(orientador2);
		
		Inscricao inscricaoRet1 = Mockito.mock(Inscricao.class);
		Mockito.when(inscricaoDAO.findById(10L)).thenReturn(inscricaoRet1);
		
		Inscricao inscricaoRet2 = Mockito.mock(Inscricao.class);
		Mockito.when(inscricaoDAO.findById(20L)).thenReturn(inscricaoRet2);
		
		Inscricao inscricaoRet3 = Mockito.mock(Inscricao.class);
		Mockito.when(inscricaoDAO.findById(60L)).thenReturn(inscricaoRet3);
		
		Inscricao inscricaoRet4 = Mockito.mock(Inscricao.class);
		Mockito.when(inscricaoDAO.findById(640L)).thenReturn(inscricaoRet4);
		
		String orientadoresErro = inscricaoService.salvaOrientadores(listaInscricoes, nomeOrientadores);
		
		Mockito.verify(inscricaoRet1).setOrientadorAtribuido(null);
		Mockito.verify(inscricaoRet2).setOrientadorAtribuido(null);
		Mockito.verify(inscricaoRet3).setOrientadorAtribuido(orientador1);
		Mockito.verify(inscricaoRet4).setOrientadorAtribuido(orientador2);

		Mockito.verify(inscricaoDAO).save(inscricaoRet1);
		Mockito.verify(inscricaoDAO).save(inscricaoRet2);
		Mockito.verify(inscricaoDAO).save(inscricaoRet3);
		Mockito.verify(inscricaoDAO).save(inscricaoRet4);

		assertEquals("Jose", orientadoresErro);
	}
	
	public void testSalvaOrientadoresComMaisDeUmErro() {
		List<Inscricao> listaInscricoes = new ArrayList<Inscricao>();
		List<String> nomeOrientadores = new ArrayList<String>();

		Inscricao inscricao1 = new Inscricao();
		inscricao1.setInscricaoID(10L);

		Inscricao inscricao2 = new Inscricao();
		inscricao2.setInscricaoID(20L);

		Inscricao inscricao3 = new Inscricao();
		inscricao3.setInscricaoID(60L);

		Inscricao inscricao4 = new Inscricao();
		inscricao4.setInscricaoID(640L);

		listaInscricoes.add(inscricao1);
		listaInscricoes.add(inscricao2);
		listaInscricoes.add(inscricao3);
		listaInscricoes.add(inscricao4);

		nomeOrientadores.add("Jose");
		nomeOrientadores.add("Maria");
		nomeOrientadores.add("Fuinha");
		nomeOrientadores.add("Quiabo da Silva");

		Orientador orientador1 = new Orientador("Orientador 1");
		Orientador orientador2 = new Orientador("Orientador 2");

		Mockito.when(orientadorService.procuraOrientadorPorNome("Jose"))
				.thenReturn(null);
		Mockito.when(orientadorService.procuraOrientadorPorNome("Fuinha"))
				.thenReturn(orientador1);
		Mockito.when(
				orientadorService.procuraOrientadorPorNome("Quiabo da Silva"))
				.thenReturn(orientador2);
		
		Inscricao inscricaoRet1 = Mockito.mock(Inscricao.class);
		Mockito.when(inscricaoDAO.findById(10L)).thenReturn(inscricaoRet1);
		
		Inscricao inscricaoRet2 = Mockito.mock(Inscricao.class);
		Mockito.when(inscricaoDAO.findById(20L)).thenReturn(inscricaoRet2);
		
		Inscricao inscricaoRet3 = Mockito.mock(Inscricao.class);
		Mockito.when(inscricaoDAO.findById(60L)).thenReturn(inscricaoRet3);
		
		Inscricao inscricaoRet4 = Mockito.mock(Inscricao.class);
		Mockito.when(inscricaoDAO.findById(640L)).thenReturn(inscricaoRet4);
		
		String orientadoresErro = inscricaoService.salvaOrientadores(listaInscricoes, nomeOrientadores);
		
		Mockito.verify(inscricaoRet1).setOrientadorAtribuido(null);
		Mockito.verify(inscricaoRet2).setOrientadorAtribuido(null);
		Mockito.verify(inscricaoRet3).setOrientadorAtribuido(orientador1);
		Mockito.verify(inscricaoRet4).setOrientadorAtribuido(orientador2);

		Mockito.verify(inscricaoDAO).save(inscricaoRet1);
		Mockito.verify(inscricaoDAO).save(inscricaoRet2);
		Mockito.verify(inscricaoDAO).save(inscricaoRet3);
		Mockito.verify(inscricaoDAO).save(inscricaoRet4);

		assertEquals("Jose, Maria", orientadoresErro);
	}
	
	public void testSalvaOrientadoresSemErros() {
		List<Inscricao> listaInscricoes = new ArrayList<Inscricao>();
		List<String> nomeOrientadores = new ArrayList<String>();

		Inscricao inscricao1 = new Inscricao();
		inscricao1.setInscricaoID(60L);

		Inscricao inscricao2 = new Inscricao();
		inscricao2.setInscricaoID(640L);

		listaInscricoes.add(inscricao1);
		listaInscricoes.add(inscricao2);

		nomeOrientadores.add("Fuinha");
		nomeOrientadores.add("Quiabo da Silva");

		Orientador orientador1 = new Orientador("Orientador 1");
		Orientador orientador2 = new Orientador("Orientador 2");

		Mockito.when(orientadorService.procuraOrientadorPorNome("Fuinha"))
				.thenReturn(orientador1);
		Mockito.when(
				orientadorService.procuraOrientadorPorNome("Quiabo da Silva"))
				.thenReturn(orientador2);
		
		Inscricao inscricaoRet1 = Mockito.mock(Inscricao.class);
		Mockito.when(inscricaoDAO.findById(60L)).thenReturn(inscricaoRet1);
		
		Inscricao inscricaoRet2 = Mockito.mock(Inscricao.class);
		Mockito.when(inscricaoDAO.findById(640L)).thenReturn(inscricaoRet2);
		
		String orientadoresErro = inscricaoService.salvaOrientadores(listaInscricoes, nomeOrientadores);
		
		Mockito.verify(inscricaoRet1).setOrientadorAtribuido(orientador1);
		Mockito.verify(inscricaoRet2).setOrientadorAtribuido(orientador2);

		Mockito.verify(inscricaoDAO).save(inscricaoRet1);
		Mockito.verify(inscricaoDAO).save(inscricaoRet2);

		assertEquals("", orientadoresErro);
	}
}
